package com.tqyan.service.transfer;

import com.tqyan.service.transfer.jieba.Keyword;
import com.tqyan.service.transfer.jieba.TFIDFAnalyzer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 单词服务
 * <p> <功能详细描述> </p>
 *
 * @author 陈晨
 * @version 1.0
 * @date 2023/4/22
 */
@Component
@Slf4j
public class WordService {
    private static final TFIDFAnalyzer TFIDF_ANALYZER = new TFIDFAnalyzer();

    /**
     * @description 提取关键词
     * <p> <功能详细描述> </p>
     *
     * @author 陈晨
     * @date 2023/4/22 11:11
     */
    public String extract(String content, int topN) {
        if (StringUtils.isBlank(content) || topN < 1) {
            return "";
        }
        List<Keyword> list = TFIDF_ANALYZER.analyze(content.toLowerCase(), topN);
        List<String> wordSet = new ArrayList<>();
        for(Keyword word : list) {
//            log.info("[关键词] word={}, tfidfValue={}", word.getName(), word.getTfidfvalue());
            // 过滤纯数字关键词
//            if (word.getName().matches("[0-9]+")) {
//                continue;
//            }
            wordSet.add(word.getName());
        }
        return StringUtils.join(wordSet, ",");
    }
    public String extract(String content) {
        // 每x字, 1个关键词
        int n = content.length() / 25;
        return this.extract(content, Math.max(n, 2));
    }

    /**
     * @description 计算编辑距离
     * <p>
     *     Levenshtein距离（编辑距离）：可以适用于不等长字符串，它可以通过增加、删除、替换字符来将一个字符串变成另一个字符串，
     *     而编辑距离就是将一个字符串转化为另一个字符串所需要的最少操作次数。编辑距离越小，则相似度越高。
     *
     *     此方法使用Levenshtein距离算法计算相似度，返回值为0到1之间的小数，表示相似度百分比。
     *     例如，相似度为0.8表示两个字符串的相似程度为80%。
     * </p>
     *
     * @author 陈晨
     * @date 2023/4/20 18:06
     */
    public double calculateStringSimilarity(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        int[][] dp = new int[len1 + 1][len2 + 1];
        for (int i = 0; i <= len1; i++) {
            dp[i][0] = i;
        }
        for (int j = 0; j <= len2; j++) {
            dp[0][j] = j;
        }
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                }
            }
        }
        int maxLen = Math.max(len1, len2);
        return 1 - (double) dp[len1][len2] / maxLen;
    }

    public static void main(String[] args) {
//        JiebaSegmenter segmenter = new JiebaSegmenter();
//        for (SegToken token : segmenter.process(content, JiebaSegmenter.SegMode.SEARCH)) {
//            if (token.word.length() < 2) {
//                continue;
//            }
//            System.out.println(token.word + "\t" + token.startOffset + "\t" + token.endOffset);
//        }

        WordService service = new WordService();
        int topN = 10;
        String content1 = "字太白，号青莲居士，祖籍陇西成纪（今甘肃省秦安县），出生于绵州昌隆县青莲乡。唐朝伟大的浪漫主义诗人，凉武昭王李暠九世孙。为人爽朗大方，乐于交友，爱好饮酒作诗，名列“酒中八仙”。曾经得到唐玄宗李隆基赏识，担任翰林学士，赐金放还，游历全国，先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗即位后，卷入永王之乱，流放夜郎，辗转到达当涂县令李阳冰家。上元二年，去世，时年六十二。著有《李太白集》，代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等。李白所作词赋，就其开创意义及艺术成就而言，享有极为崇高的地位，后世誉为“诗仙”，与诗圣杜甫并称“李杜”。";
        String key1 = service.extract(content1, topN);
        System.out.println("key: " + key1);
        System.out.println();
    }

}


